//配置路由的地方
import Vue from 'vue';
import VueRouter from "vue-router";
import routes from './routes'
//引入store
import store from '@/store';
//使用插件
Vue.use(VueRouter);


//先把VueRouter 原型对象的push保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
//重写push|replace
//第一个参数,告诉原来的push方法,往哪里跳转,
VueRouter.prototype.push = function(location,resolve,reject){
    if(resolve&&reject){
        //call||apply
        //相同点,调用函数一次,都可以改变指针方向
        //不同点,call与apply传递参数,call, apply传递参数时第二个参数是数组
        originPush.call(this,location,resolve,reject);
    }else{
        originPush.call(this,location,() => {},() => {})
    }
}
VueRouter.prototype.replace = function(location,resolve,reject){
    if(resolve&&reject){
        //call||apply
        //相同点,调用函数一次,都可以改变指针方向
        //不同点,call与apply传递参数,call, apply传递参数时第二个参数是数组
        originReplace.call(this,location,resolve,reject);
    }else{
        originReplace.call(this,location,() => {},() => {})
    }
}

//配置路由
let router = new VueRouter({
    //配置路由
    routes,
    // eslint-disable-next-line no-unused-vars
    scrollBehavior(to, from, savedPosition) {
        // 始终滚动到顶部
        return { y: 0 }
      },
});

//进行路由跳转的判断
//路由守卫  全局前置路由守卫
router.beforeEach(async(to,from,next) => { 
     //to:获取到要跳转到的路由信息
   //from：获取到从哪个路由跳转过来来的信息
   //next: next() 放行  next(path) 放行 
   //获取几个关键的判断变量
   let token = store.state.user.token;
   let name = store.state.user.userInfo.name;
   //用户登录下
   if(token){
     //用户已经登录
     //登录后的用户注册,登录界面不能再进入
     if(to.path == '/login' || to.path == '/register'){
        next('/home');
     }else{
       //已经登录,并且去的不是登录或注册页面
       //登录了并且有用户信息就放行
       if(name){
        next();
       }else{
       // next();
        //登录了没有用户信息
        //在路由跳转之前获取用户信息且放行
         //发请求获取用户信息
         try{
          await store.dispatch('user/getUserInfo');
          next();
         }catch(error){
            //获取用户信息失败,那就退出登录,跳到登录页面
          await store.dispatch('user/userLogout')
          next('/login')
         }
       }
     }
   }else{
    //说明未登录,不能去订单,交易,支付相关的页面
    //未登录去登录页面
    let toPath = to.path;
    if(toPath.indexOf('/trade')!=-1 || toPath.indexOf('/pay')!=-1||toPath.indexOf('/center')!=-1){
      //把未登录的时候向去而没有去成的信息，存储于地址栏中【路由】
      next('/login?redirect='+toPath);
    }else{
       //去的不是上面这些路由（home|search|shopCart）---放行
       next();
    }
   }
 })


export default router;